package tables

// Course 课程基本信息。关于课程价格、积分等等在扩充模块中做，这里只保留基本信息。
// 因为产品定位是企业学习考试系统的话，to B 业务很大程度是用不到这些功能的。
// 对于 to C 业务，例如 k12教育等，价格积分等应该是核心模块，要做事务等，也需要抽离。怎么算都不应该放这里
type Course struct {
	Id             int64   `json:"id,string" gorm:"primaryKey;column:id"`
	Name           string  `json:"name"`            // 课程名称
	Code           string  `json:"code"`            // 课程编号
	Cover          string  `json:"cover"`           // 封面图片的base64
	Describe       string  `json:"describe"`        // 课程描述
	Status         int     `json:"status"`          // 状态 1-暂存；2-就绪；3-发布；4-撤回；
	CourseDuration int64   `json:"courseDuration"`  // 课程时长
	AllowedX       int     `json:"allowedX"`        // 是否允许倍速播放，0-不允许，大于零是可以接受的倍速
	ClassHour      float64 `json:"classHour"`       // 学时，学完可以增加的值
	ClassScore     float64 `json:"classScore"`      // 学分，学完可以增加的值
	Label          string  `json:"label"`           // 标签
	SupportMobile  bool    `json:"supportMobile"`   // 是否支持移动设备
	FolderId       int64   `json:"folderId,string"` // 课程归属目录
	Sort           int8    `json:"sort"`            // 排序，1最大
	IsPublic       bool    `json:"isPublic"`        // 是否公开
	AutoCreateInfo
}

func (r *Course) TableName() string {
	return "lms_course"
}

// CourseExtend 课程扩展信息，一些需要频繁更新、需要聚合查询统计的数据
type CourseExtend struct {
	Id                int64   `json:"id,string"`                // 课程ID
	TotalPersonNum    int64   `json:"totalPersonNum,string"`    // 总学习人数
	TotalPersonTime   int64   `json:"totalPersonTime,string"`   // 总学习人次
	TotalLearningTime int64   `json:"totalLearningTime,string"` //总学习时长
	CollectorNum      int64   `json:"collectorNum,string"`      // 收藏数
	LikeNum           int64   `json:"likeNum,string"`           // 点赞数
	Ranking           float32 `json:"ranking"`                  //评分
	RankNum           int64   `json:"rankNum"`                  // 评分人数
	CommentNum        int64   `json:"commentNum,string"`        // 评论数
	CompletedStudyNum int64   `json:"completedStudyNum,string"` // 完成学习的人数
}

func (r *CourseExtend) TableName() string {
	return "lms_course_extend"
}

// MapCourseware 课程课件映射。
// 完整的映射关系应该是：课程可以设置章节、章节对应素材，都是多对多关系。每个章节都能设置附加信息，后面在设计。
// 先推主线，实现在线学习、考试和知识蒸馏
type MapCourseware struct {
	CourseId     int64
	CoursewareId int64
}

func (r *MapCourseware) TableName() string {
	return "lms_map_courseware"
}

// MapCourse2Org 课程和单位的映射
type MapCourse2Org struct {
	CourseId int64 `json:"courseId,omitempty"`
	OrgId    int64 `json:"orgId,omitempty"`
}

func (r *MapCourse2Org) TableName() string {
	return "lms_map_course_org"
}

// MapCourse2User 课程和用户的映射
type MapCourse2User struct {
	CourseId int64 `json:"courseId,omitempty"`
	UserId   int64 `json:"userId,omitempty"`
}

func (r *MapCourse2User) TableName() string {
	return "lms_map_course_user"
}
